import java.util.Arrays;

public class MyArraysList {
      int [] elem;//顺序表采用数组存储，因为要先定义一个数组。
      int usedSize=0;//这是记录在顺序表存储了多少个元素。
      private  static  final int defindSize=3;
    //这是你第一次要开辟多少数组空间
    public  MyArraysList(){
        this.elem=new int[defindSize];//开辟数组空间
    }
    public  void display(){
        for (int i = 0; i <usedSize ; i++) {
            System.out.print(elem[i]+" ");
        }
        System.out.println();
    }
   public void add(int data){
        //1.要看空间是否可以足够的空间
        //空间不足，重新开辟两倍的空间，并将数据拷贝过去。
        if(isFull()){
            this.elem=Arrays.copyOf(
                    this.elem,this.elem.length*2);
        }
        //2.添加数据
        this.elem[this.usedSize]=data;
        //3.记录数组的元素个数增加
        this.usedSize++;

   }
   public boolean isFull() {
       return usedSize >= this.elem.length;
   }
   public void add(int pos,int data) throws IndexWrongExcepetion{
        //先判断数组是否满了
        if(isFull()){
            //开辟空间
          this.elem=Arrays.copyOf(
                    this.elem,this.elem.length*2);
        }
        //判断插入的位置是否正确
       if(pos<0||pos>usedSize){
           //这里抛出异常
       throw new IndexWrongExcepetion("插入的位置有错误");
       }
       //这里将pos后面的值后移，从尾巴开始
       for (int i = usedSize-1; i >=pos ; i--) {
           this.elem[i+1]=this.elem[i];
       }
       this.elem[pos]=data;
       this.usedSize++;
   }
   public  boolean isEmpty(){
        return  usedSize==0;
   }
   public void remove(int key) throws  emptyException{
        if(isEmpty()){//当usedSize为空的时候，顺序表为空
            System.out.println("该顺序表为空，无法删除");
            throw new emptyException("顺序表为空");
        }
        //1.先查找这个关键字存在不
       int flag=findKey(key);
       if(flag<0){
           System.out.println("查找此数不在数组中");
       }
       //删除此数
       for (int i = flag; i <usedSize-1 ; i++) {
           this.elem[i]=this.elem[i+1];
       }
       this.usedSize--;//记录有效元素的个数减
   }
   protected  int findKey(int key){
       for (int i = 0; i <usedSize ; i++) {
           if(this.elem[i]==key){
               return i;
           }
       }
       return -1;
   }
   public  boolean contains(int toFind){
        //这里就是遍历顺序表，进行查找
       for (int x: elem) {
           if(x==toFind){
               return true;
           }
       }
       return  false;
   }
   public  void set(int pos,int value) throws  IndexWrongExcepetion{
      if(isEmpty()) {
          throw new IndexWrongExcepetion("该顺序表为空");
      }
        //要先判断给位置是否合法
       if(pos<0||pos>usedSize){
           throw  new IndexWrongExcepetion("给予的pos错误");
       }
       //更改元素值
       this.elem[pos]=value;
   }
}
